package org.forever.util
{
	/**
	* 基于邻接边表实现图的边结构
	*/
	public class Edge_List implements Edge
	{
		public	var info:Object;//当前边中存放的数据元素
		public var ePosInE:Position;//当前边在所属的图的边表中的位置	
		public var vPosInV:Array;//当前边两个端点在顶点表中的位置
		public var ePosInI:Array;//当前边在其两个端点的关联边表中的位置
		
		//约定：第0（1）个顶点分别为尾（头）顶点
		//禁止头、尾顶点相同的边
		public var type:int;//（经过遍历之后）边被归入的类别
		
		//构造方法：在图G中，生成一条从顶点u到v的新边（假定该边尚不存在）
		public function Edge_List(G:Graph,u:Vertex_List,v:Vertex_List,x:Object)
		{
			info = x;//数据元素
			ePosInE = G.insertE(this);//当前边在所属的图的边表中的位置
			vPosInV = new Array();//当前边两个端点在顶点表中的位置
			vPosInV[0] = u.getVPosInV(); 
			vPosInV[1] = v.getVPosInV();
			ePosInI = new Array();//当前边在其两个端点的关联边表中的位置
			ePosInI[0] = u.outEdges.insertLast(this);//当前边加入u的邻接（出）边表
			ePosInI[1] = v.inEdges.insertLast(this);//当前边加入v的邻接（入）边表
			type = UNKNOWN;
		}
		
		public function getInfo():Object
		{
			return info;
		}
		
		public function setInfo(x:Object):Object
		{
			var e:Object = info; info = x; return e;
		}
		
		public function getEPosInE():Position
		{
			return ePosInE;
		}
		
		public function getVPosInV(i:int):Position
		{
			return vPosInV[i];
		}
		
		public function getEPosInI(i:int):Position
		{
			return ePosInI[i];
		}
		
		public function getType():int
		{
			return type;
		}
		
		public function setType(t:int):int
		{
			var tt:int = type; type = t; return tt;
		}
	}
}